home *** CD-ROM | disk | FTP | other *** search
/ Windows Game Programming for Dummies (2nd Edition) / WinGamProgFD.iso / mac / DirectX SDK / DXSDK / samples / Multimedia / Direct3D / MFCTex / mfcform.cpp < prev    next >
C/C++ Source or Header  |  2001-10-31  |  28KB  |  639 lines

  1. //-----------------------------------------------------------------------------
  2. // File: MFCForm.cpp
  3. //
  4. // Desc: File for the dialog form for the MFC multi-texture demo.
  5. //
  6. // Copyright (c) 1997-2001 Microsoft Corporation. All rights reserved.
  7. //-----------------------------------------------------------------------------
  8. #include "stdafx.h"
  9. #include <stdio.h>
  10. #include <D3DX8.h>
  11. #include "D3DApp.h"
  12. #include "D3DFont.h"
  13. #include "D3DUtil.h"
  14. #include "DXUtil.h"
  15. #include "MFCTex.h"
  16. #include "TexArgs.h"
  17.  
  18.  
  19.  
  20.  
  21. //-----------------------------------------------------------------------------
  22. // Global data and objects
  23. //-----------------------------------------------------------------------------
  24. extern CApp g_App;
  25.  
  26.  
  27.  
  28.  
  29. //-----------------------------------------------------------------------------
  30. // External storage of the texture stage states
  31. //-----------------------------------------------------------------------------
  32. extern WORD  g_wT0COp,   g_wT1COp,   g_wT2COp;
  33. extern WORD  g_wT0CArg1, g_wT1CArg1, g_wT2CArg1;
  34. extern WORD  g_wT0CArg2, g_wT1CArg2, g_wT2CArg2;
  35. extern WORD  g_wT0AOp,   g_wT1AOp,   g_wT2AOp;
  36. extern WORD  g_wT0AArg1, g_wT1AArg1, g_wT2AArg1;
  37. extern WORD  g_wT0AArg2, g_wT1AArg2, g_wT2AArg2;
  38. extern DWORD g_dwTextureFactor;
  39. extern DWORD g_dwDiffuseColor;
  40. extern DWORD g_dwMaxTextureBlendStages ;
  41.  
  42.  
  43. VOID CAppForm::InitializeUIControls()
  44. {
  45.     
  46.     // Get ptrs to the combo box controls for texture stage state UI
  47.     m_pTex0ColorArg1 = (CComboBox*)GetDlgItem( IDC_TEX0_COLORARG1 );
  48.     m_pTex0ColorOp   = (CComboBox*)GetDlgItem( IDC_TEX0_COLOROP );
  49.     m_pTex0ColorArg2 = (CComboBox*)GetDlgItem( IDC_TEX0_COLORARG2 );
  50.     m_pTex0AlphaArg1 = (CComboBox*)GetDlgItem( IDC_TEX0_ALPHAARG1 );
  51.     m_pTex0AlphaOp   = (CComboBox*)GetDlgItem( IDC_TEX0_ALPHAOP );
  52.     m_pTex0AlphaArg2 = (CComboBox*)GetDlgItem( IDC_TEX0_ALPHAARG2 );
  53.     m_pTex1ColorArg1 = (CComboBox*)GetDlgItem( IDC_TEX1_COLORARG1 );
  54.     m_pTex1ColorOp   = (CComboBox*)GetDlgItem( IDC_TEX1_COLOROP );
  55.     m_pTex1ColorArg2 = (CComboBox*)GetDlgItem( IDC_TEX1_COLORARG2 );
  56.     m_pTex1AlphaArg1 = (CComboBox*)GetDlgItem( IDC_TEX1_ALPHAARG1 );
  57.     m_pTex1AlphaOp   = (CComboBox*)GetDlgItem( IDC_TEX1_ALPHAOP );
  58.     m_pTex1AlphaArg2 = (CComboBox*)GetDlgItem( IDC_TEX1_ALPHAARG2 );
  59.     m_pTex2ColorArg1 = (CComboBox*)GetDlgItem( IDC_TEX2_COLORARG1 );
  60.     m_pTex2ColorOp   = (CComboBox*)GetDlgItem( IDC_TEX2_COLOROP );
  61.     m_pTex2ColorArg2 = (CComboBox*)GetDlgItem( IDC_TEX2_COLORARG2 );
  62.     m_pTex2AlphaArg1 = (CComboBox*)GetDlgItem( IDC_TEX2_ALPHAARG1 );
  63.     m_pTex2AlphaOp   = (CComboBox*)GetDlgItem( IDC_TEX2_ALPHAOP );
  64.     m_pTex2AlphaArg2 = (CComboBox*)GetDlgItem( IDC_TEX2_ALPHAARG2 );
  65.  
  66.     GetDlgItem( IDC_TEX0_NAME )->SetWindowText( _T("env2.bmp") );
  67.     GetDlgItem( IDC_TEX1_NAME )->SetWindowText( _T("spotlite.bmp") );
  68.     GetDlgItem( IDC_TEX2_NAME )->SetWindowText( _T("env3.bmp") );
  69.     OnChangeTex();
  70.  
  71.     GetDlgItem( IDC_BLEND_FACTOR )->SetWindowText( _T("80808080") );
  72.     OnChangeBlendFactor();
  73.  
  74.     GetDlgItem( IDC_DIFFUSE_COLOR )->SetWindowText( _T("ff0000ff") );
  75.     OnChangeDiffuseColor();
  76.  
  77.     for( TCHAR** pstrTexOps = g_astrTextureOps; *pstrTexOps; pstrTexOps++ )
  78.     {
  79.         m_pTex0ColorOp->AddString( *pstrTexOps );
  80.         m_pTex0AlphaOp->AddString( *pstrTexOps );
  81.         m_pTex1ColorOp->AddString( *pstrTexOps );
  82.         m_pTex1AlphaOp->AddString( *pstrTexOps );
  83.         m_pTex2ColorOp->AddString( *pstrTexOps );
  84.         m_pTex2AlphaOp->AddString( *pstrTexOps );
  85.     }
  86.  
  87.     for( TCHAR** pstrArgs1 = g_astrTextureArgs1; *pstrArgs1; pstrArgs1++ )
  88.     {
  89.         m_pTex0ColorArg1->AddString( *pstrArgs1 );
  90.         m_pTex0AlphaArg1->AddString( *pstrArgs1 );
  91.         m_pTex1ColorArg1->AddString( *pstrArgs1 );
  92.         m_pTex1AlphaArg1->AddString( *pstrArgs1 );
  93.         m_pTex2ColorArg1->AddString( *pstrArgs1 );
  94.         m_pTex2AlphaArg1->AddString( *pstrArgs1 );
  95.     }
  96.  
  97.     for( TCHAR** pstrArgs2 = g_astrTextureArgs2; *pstrArgs2; pstrArgs2++ )
  98.     {
  99.         m_pTex0ColorArg2->AddString( *pstrArgs2 );
  100.         m_pTex0AlphaArg2->AddString( *pstrArgs2 );
  101.         m_pTex1ColorArg2->AddString( *pstrArgs2 );
  102.         m_pTex1AlphaArg2->AddString( *pstrArgs2 );
  103.         m_pTex2ColorArg2->AddString( *pstrArgs2 );
  104.         m_pTex2AlphaArg2->AddString( *pstrArgs2 );
  105.     }
  106.  
  107.     for( TCHAR** pstrPresets = g_astrPresetEffects; *pstrPresets; pstrPresets++ )
  108.     {
  109.         ((CComboBox*)GetDlgItem( IDC_PRESET_EFFECTS ))->AddString( *pstrPresets );
  110.     }
  111.     OnChangePresetEffects();
  112.  
  113.     // Store the initial media directory (for loading textures)
  114.     strcpy( m_strInitialDir, DXUtil_GetDXSDKMediaPath() );
  115. }
  116.  
  117.  
  118.  
  119.  
  120. //-----------------------------------------------------------------------------
  121. // Name: UpdateUIForDeviceCapabilites()
  122. // Desc: Whenever we get a new device, call this function to enable/disable the
  123. //       appropiate UI controls to match the device's capabilities.
  124. //-----------------------------------------------------------------------------
  125. VOID CAppForm::UpdateUIForDeviceCapabilites()
  126. {
  127.     g_dwMaxTextureBlendStages = (DWORD)m_d3dCaps.MaxTextureBlendStages;
  128.  
  129.     m_pTex1ColorOp->EnableWindow( g_dwMaxTextureBlendStages>1 ? TRUE : FALSE );
  130.     m_pTex1AlphaOp->EnableWindow( g_dwMaxTextureBlendStages>1 ? TRUE : FALSE );
  131.     m_pTex1ColorArg1->EnableWindow( g_dwMaxTextureBlendStages>1 ? TRUE : FALSE );
  132.     m_pTex1ColorArg2->EnableWindow( g_dwMaxTextureBlendStages>1 ? TRUE : FALSE );
  133.     m_pTex1AlphaArg1->EnableWindow( g_dwMaxTextureBlendStages>1 ? TRUE : FALSE );
  134.     m_pTex1AlphaArg2->EnableWindow( g_dwMaxTextureBlendStages>1 ? TRUE : FALSE );
  135.  
  136.     m_pTex2ColorOp->EnableWindow( g_dwMaxTextureBlendStages>2 ? TRUE : FALSE );
  137.     m_pTex2AlphaOp->EnableWindow( g_dwMaxTextureBlendStages>2 ? TRUE : FALSE );
  138.     m_pTex2ColorArg1->EnableWindow( g_dwMaxTextureBlendStages>2 ? TRUE : FALSE );
  139.     m_pTex2ColorArg2->EnableWindow( g_dwMaxTextureBlendStages>2 ? TRUE : FALSE );
  140.     m_pTex2AlphaArg1->EnableWindow( g_dwMaxTextureBlendStages>2 ? TRUE : FALSE );
  141.     m_pTex2AlphaArg2->EnableWindow( g_dwMaxTextureBlendStages>2 ? TRUE : FALSE );
  142. }
  143.  
  144.  
  145.  
  146.  
  147. //-----------------------------------------------------------------------------
  148. // Name: OnChangeTex()
  149. // Desc: When the user hits a texture change button
  150. //-----------------------------------------------------------------------------
  151. VOID CAppForm::OnChangeTex()
  152. {
  153.     CString strName0, strName1, strName2;
  154.  
  155.     ((CEdit*)GetDlgItem( IDC_TEX0_NAME ))->GetWindowText( strName0 );
  156.     ((CEdit*)GetDlgItem( IDC_TEX1_NAME ))->GetWindowText( strName1 );
  157.     ((CEdit*)GetDlgItem( IDC_TEX2_NAME ))->GetWindowText( strName2 );
  158.  
  159.     SetTextureMaps( (LPCTSTR)strName0, (LPCTSTR)strName1, (LPCTSTR)strName2 );
  160. }
  161.  
  162.  
  163.  
  164. //-----------------------------------------------------------------------------
  165. // Name: OnSelectTexture0Name()
  166. // Desc: When the user hits a texture change button
  167. //-----------------------------------------------------------------------------
  168. VOID CAppForm::OnSelectTexture0Name()
  169. {
  170.     TCHAR strTextureName[MAX_PATH] = _T("");
  171.  
  172.     // Display the OpenFileName dialog. Then, try to load the specified file
  173.     OPENFILENAME ofn = { sizeof(OPENFILENAME), NULL, NULL,
  174.                          _T("Texture Files (.bmp;.tga)\0*.bmp;*.tga\0\0"), 
  175.                          NULL, 0, 1, strTextureName, MAX_PATH, m_strFileName, MAX_PATH, 
  176.                          m_strInitialDir, _T("Open Texture File"), 
  177.                          OFN_FILEMUSTEXIST, 0, 1, NULL, 0, NULL, NULL };
  178.  
  179.     if( TRUE == GetOpenFileName( &ofn ) )
  180.     {
  181.         GetDlgItem(IDC_TEX0_NAME)->SetWindowText( m_strFileName );
  182.         OnChangeTex();
  183.     }
  184. }
  185.  
  186.  
  187.  
  188.  
  189. //-----------------------------------------------------------------------------
  190. // Name: OnSelectTexture1Name()
  191. // Desc: When the user hits a texture change button
  192. //-----------------------------------------------------------------------------
  193. VOID CAppForm::OnSelectTexture1Name()
  194. {
  195.     TCHAR strTextureName[MAX_PATH] = _T("");
  196.  
  197.     // Display the OpenFileName dialog. Then, try to load the specified file
  198.     OPENFILENAME ofn = { sizeof(OPENFILENAME), NULL, NULL,
  199.                          _T("Texture Files (.bmp;.tga)\0*.bmp;*.tga\0\0"), 
  200.                          NULL, 0, 1, strTextureName, MAX_PATH, m_strFileName, MAX_PATH, 
  201.                          m_strInitialDir, _T("Open Texture File"), 
  202.                          OFN_FILEMUSTEXIST, 0, 1, NULL, 0, NULL, NULL };
  203.  
  204.     if( TRUE == GetOpenFileName( &ofn ) )
  205.     {
  206.         GetDlgItem(IDC_TEX1_NAME)->SetWindowText( m_strFileName );
  207.         OnChangeTex();
  208.     }
  209. }
  210.  
  211.  
  212.  
  213.  
  214. //-----------------------------------------------------------------------------
  215. // Name: OnSelectTexture2Name()
  216. // Desc: When the user hits a texture change button
  217. //-----------------------------------------------------------------------------
  218. VOID CAppForm::OnSelectTexture2Name()
  219. {
  220.     TCHAR strTextureName[MAX_PATH] = _T("");
  221.  
  222.     // Display the OpenFileName dialog. Then, try to load the specified file
  223.     OPENFILENAME ofn = { sizeof(OPENFILENAME), NULL, NULL,
  224.                          _T("Texture Files (.bmp;.tga)\0*.bmp;*.tga\0\0"), 
  225.                          NULL, 0, 1, strTextureName, MAX_PATH, m_strFileName, MAX_PATH, 
  226.                          m_strInitialDir, _T("Open Texture File"), 
  227.                          OFN_FILEMUSTEXIST, 0, 1, NULL, 0, NULL, NULL };
  228.  
  229.     if( TRUE == GetOpenFileName( &ofn ) )
  230.     {
  231.         GetDlgItem(IDC_TEX2_NAME)->SetWindowText( m_strFileName );
  232.         OnChangeTex();
  233.     }
  234. }
  235.  
  236.  
  237.  
  238.  
  239. //-----------------------------------------------------------------------------
  240. // Name: UpdateStageColor()
  241. // Desc: Updates a stage's ColorOp parameters in the form's UI.
  242. //-----------------------------------------------------------------------------
  243. VOID CAppForm::UpdateStageColor( WORD stage, LONG op, LONG arg1, LONG arg2 )
  244. {
  245.     WORD wListID = IDC_TEX0_COLOROP;
  246.  
  247.     if( stage == 1 )
  248.         wListID = IDC_TEX1_COLOROP;
  249.     if( stage == 2 )
  250.         wListID = IDC_TEX2_COLOROP;
  251.  
  252.     ((CComboBox*)GetDlgItem( wListID+0 ))->SetCurSel( op );
  253.     ((CComboBox*)GetDlgItem( wListID+1 ))->SetCurSel( arg1 );
  254.     ((CComboBox*)GetDlgItem( wListID+2 ))->SetCurSel( arg2 );
  255. }
  256.  
  257.  
  258.  
  259.  
  260. //-----------------------------------------------------------------------------
  261. // Name: UpdateStageAlpha()
  262. // Desc: Updates a stage's AlphaOp parameters in the form's UI.
  263. //-----------------------------------------------------------------------------
  264. VOID CAppForm::UpdateStageAlpha( WORD stage, LONG op, LONG arg1, LONG arg2 )
  265. {
  266.     WORD wListID = IDC_TEX0_ALPHAOP;
  267.  
  268.     if( stage == 1 )
  269.         wListID = IDC_TEX1_ALPHAOP;
  270.     if( stage == 2 )
  271.         wListID = IDC_TEX2_ALPHAOP;
  272.  
  273.     ((CComboBox*)GetDlgItem( wListID+0 ))->SetCurSel( op );
  274.     ((CComboBox*)GetDlgItem( wListID+1 ))->SetCurSel( arg1 );
  275.     ((CComboBox*)GetDlgItem( wListID+2 ))->SetCurSel( arg2 );
  276. }
  277.  
  278.  
  279.  
  280.  
  281. //-----------------------------------------------------------------------------
  282. // Name: OnChangePresetEffects()
  283. // Desc: When the user selects a preset texture stage effect
  284. //-----------------------------------------------------------------------------
  285. void CAppForm::OnChangePresetEffects()
  286. {
  287.     // Clear all the combo boxes in the UI
  288.     UpdateStageColor( 0, toDISABLE, ta1TEXTURE, ta2CURRENT );
  289.     UpdateStageAlpha( 0, toDISABLE, ta1TEXTURE, ta2CURRENT );
  290.     UpdateStageColor( 1, toDISABLE, ta1TEXTURE, ta2CURRENT );
  291.     UpdateStageAlpha( 1, toDISABLE, ta1TEXTURE, ta2CURRENT );
  292.     UpdateStageColor( 2, toDISABLE, ta1TEXTURE, ta2CURRENT );
  293.     UpdateStageAlpha( 2, toDISABLE, ta1TEXTURE, ta2CURRENT );
  294.  
  295.     switch( ((CComboBox*)GetDlgItem( IDC_PRESET_EFFECTS ))->GetCurSel() )
  296.     {
  297.         case CB_ERR: // No selection
  298.             UpdateStageColor( 0, toSELECTARG1, ta1TEXTURE, ta2DIFFUSE );
  299.             UpdateStageAlpha( 0, toSELECTARG1, ta1TEXTURE, ta2DIFFUSE );
  300.             break;
  301.         case  0: // Modulate
  302.             UpdateStageColor( 0, toMODULATE,   ta1TEXTURE, ta2DIFFUSE );
  303.             UpdateStageAlpha( 0, toSELECTARG1, ta1TEXTURE, ta2DIFFUSE );
  304.             break;
  305.         case  1: // Modulate Alpha
  306.             UpdateStageColor( 0, toMODULATE, ta1TEXTURE, ta2DIFFUSE );
  307.             UpdateStageAlpha( 0, toMODULATE, ta1TEXTURE, ta2DIFFUSE );
  308.             break;
  309.         case  2: // Add
  310.             UpdateStageColor( 0, toADD,        ta1TEXTURE, ta2DIFFUSE );
  311.             UpdateStageAlpha( 0, toSELECTARG2, ta1TEXTURE, ta2DIFFUSE );
  312.             break;
  313.         case  3: // Decal Alpha
  314.             UpdateStageColor( 0, toBLENDTEXTURE, ta1TEXTURE, ta2DIFFUSE );
  315.             UpdateStageAlpha( 0, toSELECTARG2,   ta1TEXTURE, ta2DIFFUSE );
  316.             break;
  317.         case  4: // Colored light map
  318.             UpdateStageColor( 0, toMODULATE,   ta1TEXTURE, ta2DIFFUSE );
  319.             UpdateStageAlpha( 0, toSELECTARG2, ta1TEXTURE, ta2DIFFUSE );
  320.             UpdateStageColor( 1, toMODULATE,   ta1TEXTURE, ta2CURRENT );
  321.             UpdateStageAlpha( 1, toSELECTARG1, ta1TEXTURE, ta2DIFFUSE );
  322.             break;
  323.         case  5: // Inverse colored light map
  324.             UpdateStageColor( 0, toMODULATE,   ta1INVTEXTURE, ta2DIFFUSE );
  325.             UpdateStageAlpha( 0, toSELECTARG2, ta1TEXTURE,    ta2DIFFUSE );
  326.             UpdateStageColor( 1, toMODULATE,   ta1INVTEXTURE, ta2CURRENT );
  327.             UpdateStageAlpha( 1, toSELECTARG1, ta1TEXTURE, ta2DIFFUSE );
  328.             break;
  329.         case  6: // Single channel light map
  330.             UpdateStageColor( 0, toSELECTARG1, ta1TEXTURE,      ta2DIFFUSE );
  331.             UpdateStageAlpha( 0, toSELECTARG1, ta1TEXTURE, ta2DIFFUSE );
  332.             UpdateStageColor( 1, toMODULATE,   ta1ALPHATEXTURE, ta2CURRENT );
  333.             UpdateStageAlpha( 1, toSELECTARG1, ta1TEXTURE, ta2DIFFUSE );
  334.             break;
  335.         case  7: // Modulate and late add
  336.             UpdateStageColor( 0, toMODULATE, ta1TEXTURE, ta2DIFFUSE );
  337.             UpdateStageAlpha( 0, toSELECTARG1, ta1TEXTURE, ta2DIFFUSE );
  338.             UpdateStageColor( 1, toADD,      ta1TEXTURE, ta2CURRENT );
  339.             UpdateStageAlpha( 1, toSELECTARG1, ta1TEXTURE, ta2DIFFUSE );
  340.             break;
  341.         case  8: // Linear blend using texture alpha
  342.             UpdateStageColor( 0, toMODULATE,     ta1TEXTURE, ta2DIFFUSE );
  343.             UpdateStageAlpha( 0, toSELECTARG2,   ta1TEXTURE, ta2DIFFUSE );
  344.             UpdateStageColor( 1, toBLENDTEXTURE, ta1TEXTURE, ta2CURRENT );
  345.             UpdateStageAlpha( 1, toSELECTARG1, ta1TEXTURE, ta2DIFFUSE );
  346.             break;
  347.         case  9: // Linear blend using diffuse alpha
  348.             UpdateStageColor( 0, toMODULATE,     ta1TEXTURE, ta2DIFFUSE );
  349.             UpdateStageAlpha( 0, toSELECTARG2,   ta1TEXTURE, ta2DIFFUSE );
  350.             UpdateStageColor( 1, toBLENDDIFFUSE, ta1TEXTURE, ta2CURRENT );
  351.             UpdateStageAlpha( 1, toSELECTARG1, ta1TEXTURE, ta2DIFFUSE );
  352.             break;
  353.         case 10: // Multitexture add w/smooth saturation
  354.             UpdateStageColor( 0, toMODULATE,   ta1TEXTURE, ta2DIFFUSE );
  355.             UpdateStageAlpha( 0, toSELECTARG2, ta1TEXTURE, ta2DIFFUSE );
  356.             UpdateStageColor( 1, toADD,        ta1TEXTURE, ta2CURRENT );
  357.             UpdateStageAlpha( 1, toSELECTARG1, ta1TEXTURE, ta2DIFFUSE );
  358.             break;
  359.         case 11: // Multitexture subtract
  360.             UpdateStageColor( 0, toMODULATE,   ta1TEXTURE,    ta2DIFFUSE );
  361.             UpdateStageAlpha( 0, toSELECTARG2, ta1TEXTURE,    ta2DIFFUSE );
  362.             UpdateStageColor( 1, toADD,        ta1INVTEXTURE, ta2CURRENT );
  363.             UpdateStageAlpha( 1, toSELECTARG1, ta1TEXTURE, ta2DIFFUSE );
  364.             break;
  365.         case 12: // Add Diffuse to light map then modulate
  366.             UpdateStageColor( 0, toADD,      ta1TEXTURE, ta2DIFFUSE );
  367.             UpdateStageAlpha( 0, toSELECTARG1, ta1TEXTURE, ta2DIFFUSE );
  368.             UpdateStageColor( 1, toMODULATE, ta1TEXTURE, ta2CURRENT );
  369.             UpdateStageAlpha( 1, toSELECTARG1, ta1TEXTURE, ta2DIFFUSE );
  370.             UpdateStageColor( 2, toMODULATE, ta1DIFFUSE, ta2CURRENT );
  371.             UpdateStageAlpha( 2, toSELECTARG1, ta1TEXTURE, ta2DIFFUSE );
  372.             break;
  373.         case 13: // Detail modulate
  374.             UpdateStageColor( 0, toMODULATE,   ta1TEXTURE, ta2DIFFUSE );
  375.             UpdateStageAlpha( 0, toSELECTARG2, ta1TEXTURE, ta2DIFFUSE );
  376.             UpdateStageColor( 1, toMODULATE2X, ta1TEXTURE, ta2CURRENT );
  377.             UpdateStageAlpha( 1, toSELECTARG1, ta1TEXTURE, ta2DIFFUSE );
  378.             break;
  379.         case 14: // Detail add
  380.             UpdateStageColor( 0, toMODULATE,   ta1TEXTURE, ta2DIFFUSE );
  381.             UpdateStageAlpha( 0, toSELECTARG2, ta1TEXTURE, ta2DIFFUSE );
  382.             UpdateStageColor( 1, toADDSIGNED,  ta1TEXTURE, ta2CURRENT );
  383.             UpdateStageAlpha( 1, toSELECTARG1, ta1TEXTURE, ta2DIFFUSE );
  384.             break;
  385.     }
  386.  
  387.     OnChangeStageArgs();
  388. }
  389.  
  390.  
  391.  
  392.  
  393. //-----------------------------------------------------------------------------
  394. // Name: OnChooseStageArgs()
  395. // Desc: When the user changes a stage arg combo box, or else when called by
  396. //       the app, this function extracts state information from the UI, and
  397. //       saves it in a form for the D3DDevice SetTextureStageState() calls.
  398. //-----------------------------------------------------------------------------
  399. void CAppForm::OnChangeStageArgs()
  400. {
  401.     g_wT0COp = aTexOps[ m_pTex0ColorOp->GetCurSel() + 1 ];
  402.     g_wT0AOp = aTexOps[ m_pTex0AlphaOp->GetCurSel() + 1 ];
  403.     g_wT1COp = aTexOps[ m_pTex1ColorOp->GetCurSel() + 1 ];
  404.     g_wT1AOp = aTexOps[ m_pTex1AlphaOp->GetCurSel() + 1 ];
  405.     g_wT2COp = aTexOps[ m_pTex2ColorOp->GetCurSel() + 1 ];
  406.     g_wT2AOp = aTexOps[ m_pTex2AlphaOp->GetCurSel() + 1 ];
  407.     if( 0 == g_wT0COp ) g_wT0COp = D3DTOP_DISABLE;
  408.     if( 0 == g_wT0AOp ) g_wT0AOp = D3DTOP_DISABLE;
  409.     if( 0 == g_wT1COp ) g_wT1COp = D3DTOP_DISABLE;
  410.     if( 0 == g_wT1AOp ) g_wT1AOp = D3DTOP_DISABLE;
  411.     if( 0 == g_wT2COp ) g_wT2COp = D3DTOP_DISABLE;
  412.     if( 0 == g_wT2AOp ) g_wT2AOp = D3DTOP_DISABLE;
  413.  
  414.     g_wT0CArg1 = aTexArgs1[ m_pTex0ColorArg1->GetCurSel() + 1 ];
  415.     g_wT0CArg2 = aTexArgs2[ m_pTex0ColorArg2->GetCurSel() + 1 ];
  416.     g_wT0AArg1 = aTexArgs1[ m_pTex0AlphaArg1->GetCurSel() + 1 ];
  417.     g_wT0AArg2 = aTexArgs2[ m_pTex0AlphaArg2->GetCurSel() + 1 ];
  418.     g_wT1CArg1 = aTexArgs1[ m_pTex1ColorArg1->GetCurSel() + 1 ];
  419.     g_wT1CArg2 = aTexArgs2[ m_pTex1ColorArg2->GetCurSel() + 1 ];
  420.     g_wT1AArg1 = aTexArgs1[ m_pTex1AlphaArg1->GetCurSel() + 1 ];
  421.     g_wT1AArg2 = aTexArgs2[ m_pTex1AlphaArg2->GetCurSel() + 1 ];
  422.     g_wT2CArg1 = aTexArgs1[ m_pTex2ColorArg1->GetCurSel() + 1 ];
  423.     g_wT2CArg2 = aTexArgs2[ m_pTex2ColorArg2->GetCurSel() + 1 ];
  424.     g_wT2AArg1 = aTexArgs1[ m_pTex2AlphaArg1->GetCurSel() + 1 ];
  425.     g_wT2AArg2 = aTexArgs2[ m_pTex2AlphaArg2->GetCurSel() + 1 ];
  426. }
  427.  
  428.  
  429.  
  430.  
  431.  
  432.  
  433. //-----------------------------------------------------------------------------
  434. // Name: OnChangeBlendFactor()
  435. // Desc: When the user enters a new blend factor
  436. //-----------------------------------------------------------------------------
  437. VOID CAppForm::OnChangeBlendFactor()
  438. {
  439.     CString strValue;
  440.     (GetDlgItem( IDC_BLEND_FACTOR ))->GetWindowText( strValue );
  441.  
  442.     const TCHAR* strFactor = (LPCTSTR)strValue;
  443.     if( (strFactor[0] == '0') && ((strFactor[1] == 'x') || (strFactor[1] == 'X')) )
  444.         strFactor += 2;
  445.  
  446.     sscanf( strFactor, _T("%x"), &g_dwTextureFactor );
  447. }
  448.  
  449.  
  450.  
  451.  
  452.  
  453. //-----------------------------------------------------------------------------
  454. // Name: OnChangeDiffuseColor()
  455. // Desc: When the user wants a new diffuse color
  456. //-----------------------------------------------------------------------------
  457. VOID CAppForm::OnChangeDiffuseColor()
  458. {
  459.     CString strValue;
  460.     (GetDlgItem( IDC_DIFFUSE_COLOR ))->GetWindowText( strValue );
  461.  
  462.     const TCHAR* strColor = (LPCTSTR)strValue;
  463.     if( (strColor[0] == '0') && ((strColor[1] == 'x') || (strColor[1] == 'X')) )
  464.         strColor += 2;
  465.  
  466.     sscanf( strColor, _T("%x"), &g_dwDiffuseColor );
  467. }
  468.  
  469.  
  470.  
  471.  
  472.  
  473. class CViewCodeDlg : public CDialog
  474. {
  475. public:
  476.     CViewCodeDlg() : CDialog(IDD_VIEWCODE) {}
  477.     BOOL OnInitDialog();
  478. };
  479.  
  480.  
  481.  
  482.  
  483. TCHAR* TranslateTextureOp( DWORD dwTexOp )
  484. {
  485.     switch( dwTexOp )
  486.     {
  487.         case D3DTOP_DISABLE:                return _T("DISABLE");
  488.         case D3DTOP_SELECTARG1:             return _T("SELECTARG1");
  489.         case D3DTOP_SELECTARG2:             return _T("SELECTARG2");
  490.         case D3DTOP_MODULATE:               return _T("MODULATE");
  491.         case D3DTOP_MODULATE2X:             return _T("MODULATE2X");
  492.         case D3DTOP_MODULATE4X:             return _T("MODULATE4X");
  493.         case D3DTOP_ADD:                    return _T("ADD");
  494.         case D3DTOP_ADDSIGNED:              return _T("ADDSIGNED");
  495.         case D3DTOP_ADDSIGNED2X:            return _T("ADDSIGNED2X");
  496.         case D3DTOP_SUBTRACT:               return _T("SUBTRACT");
  497.         case D3DTOP_ADDSMOOTH:              return _T("ADDSMOOTH");
  498.         case D3DTOP_BLENDDIFFUSEALPHA:      return _T("BLENDDIFFUSEALPHA");
  499.         case D3DTOP_BLENDTEXTUREALPHA:      return _T("BLENDTEXTUREALPHA");
  500.         case D3DTOP_BLENDFACTORALPHA:       return _T("BLENDFACTORALPHA");
  501.         case D3DTOP_BLENDTEXTUREALPHAPM:    return _T("BLENDTEXTUREALPHAPM");
  502.         case D3DTOP_BLENDCURRENTALPHA:      return _T("BLENDCURRENTALPHA");
  503.         case D3DTOP_PREMODULATE:            return _T("PREMODULATE");
  504.         case D3DTOP_MODULATEALPHA_ADDCOLOR: return _T("MODULATEALPHA_ADDCOLOR");
  505.         case D3DTOP_MODULATECOLOR_ADDALPHA: return _T("MODULATECOLOR_ADDALPHA");
  506.         case D3DTOP_MODULATEINVALPHA_ADDCOLOR: return _T("MODULATEINVALPHA_ADDCOLOR");
  507.         case D3DTOP_MODULATEINVCOLOR_ADDALPHA: return _T("MODULATEINVCOLOR_ADDALPHA");
  508.         case D3DTOP_BUMPENVMAP:             return _T("BUMPENVMAP");
  509.         case D3DTOP_BUMPENVMAPLUMINANCE:    return _T("BUMPENVMAPLUMINANCE");
  510.         case D3DTOP_DOTPRODUCT3:            return _T("DOTPRODUCT3");
  511.     }
  512.     return _T("DISABLE");
  513. }
  514.  
  515.  
  516.  
  517.  
  518. TCHAR* TranslateTextureArg( DWORD dwTexArg )
  519. {
  520.     static TCHAR buffer[256];
  521.  
  522.     switch( dwTexArg & 0x0000000f )
  523.     {
  524.         case D3DTA_DIFFUSE: strcpy( buffer, _T("D3DTA_DIFFUSE") );
  525.                             break;
  526.         case D3DTA_CURRENT: strcpy( buffer, _T("D3DTA_CURRENT") );
  527.                             break;
  528.         case D3DTA_TEXTURE: strcpy( buffer, _T("D3DTA_TEXTURE") );
  529.                             break;
  530.         case D3DTA_TFACTOR: strcpy( buffer, _T("D3DTA_TFACTOR") );
  531.                             break;
  532.         default:            return _T("D3DTA_DIFFUSE");
  533.     }
  534.  
  535.     if( dwTexArg&D3DTA_COMPLEMENT )
  536.         strcat( buffer, _T(" | D3DTA_COMPLEMENT") );
  537.     if( dwTexArg&D3DTA_ALPHAREPLICATE )
  538.         strcat( buffer, _T(" | D3DTA_ALPHAREPLICATE") );
  539.  
  540.     return buffer;
  541. }
  542.  
  543.  
  544.  
  545.  
  546. BOOL CViewCodeDlg::OnInitDialog()
  547. {
  548.     CEdit* pEdit = (CEdit*)GetDlgItem(IDC_VIEWCODEEDITBOX);
  549.  
  550.     pEdit->FmtLines(TRUE);
  551.     pEdit->SetWindowText( _T("howdy\015\012doody") );
  552.  
  553.     TCHAR* strTemplate = _T("   pd3dDevice->SetTextureStageState( %d, D3DTSS_%s%s );\015\012" );
  554.  
  555.     TCHAR buffer[2048];
  556.     TCHAR strOutText[2048] = _T("");
  557.  
  558.     strcat( strOutText, _T("HRESULT SetShader( LPDIRECT3DDEVICE8 pd3dDevice )\015\012") );
  559.     strcat( strOutText, _T("{\015\012") );
  560.  
  561.     sprintf( buffer, strTemplate, 0, _T("COLORARG1, "), TranslateTextureArg( g_wT0CArg1 ) );
  562.     if( g_wT0COp != D3DTOP_DISABLE && g_wT0COp != D3DTOP_SELECTARG2 )
  563.         strcat( strOutText, buffer );
  564.     sprintf( buffer, strTemplate, 0, _T("COLOROP,   D3DTOP_"), TranslateTextureOp( g_wT0COp ) );
  565.     strcat( strOutText, buffer );
  566.     sprintf( buffer, strTemplate, 0, _T("COLORARG2, "), TranslateTextureArg( g_wT0CArg2 ) );
  567.     if( g_wT0COp != D3DTOP_DISABLE && g_wT0COp != D3DTOP_SELECTARG1 )
  568.         strcat( strOutText, buffer );
  569.     sprintf( buffer, strTemplate, 0, _T("ALPHAARG1, "), TranslateTextureArg( g_wT0AArg1 ) );
  570.     if( g_wT0AOp != D3DTOP_DISABLE && g_wT0AOp != D3DTOP_SELECTARG2 )
  571.         strcat( strOutText, buffer );
  572.     sprintf( buffer, strTemplate, 0, _T("ALPHAOP,   D3DTOP_"), TranslateTextureOp( g_wT0AOp ) );
  573.     strcat( strOutText, buffer );
  574.     sprintf( buffer, strTemplate, 0, _T("ALPHAARG2, "), TranslateTextureArg( g_wT0AArg2 ) );
  575.     if( g_wT0AOp != D3DTOP_DISABLE && g_wT0AOp != D3DTOP_SELECTARG1 )
  576.         strcat( strOutText, buffer );
  577.     strcat( strOutText, _T("\015\012") );
  578.  
  579.     sprintf( buffer, strTemplate, 1, _T("COLORARG1, "), TranslateTextureArg( g_wT1CArg1 ) );
  580.     if( g_wT1COp != D3DTOP_DISABLE && g_wT1COp != D3DTOP_SELECTARG2 )
  581.         strcat( strOutText, buffer );
  582.     sprintf( buffer, strTemplate, 1, _T("COLOROP,   D3DTOP_"), TranslateTextureOp( g_wT1COp ) );
  583.     strcat( strOutText, buffer );
  584.     sprintf( buffer, strTemplate, 1, _T("COLORARG2, "), TranslateTextureArg( g_wT1CArg2 ) );
  585.     if( g_wT1COp != D3DTOP_DISABLE && g_wT1COp != D3DTOP_SELECTARG1 )
  586.         strcat( strOutText, buffer );
  587.     sprintf( buffer, strTemplate, 1, _T("ALPHAARG1, "), TranslateTextureArg( g_wT1AArg1 ) );
  588.     if( g_wT1AOp != D3DTOP_DISABLE && g_wT1AOp != D3DTOP_SELECTARG2 )
  589.         strcat( strOutText, buffer );
  590.     sprintf( buffer, strTemplate, 1, _T("ALPHAOP,   D3DTOP_"), TranslateTextureOp( g_wT1AOp ) );
  591.     strcat( strOutText, buffer );
  592.     sprintf( buffer, strTemplate, 1, _T("ALPHAARG2, "), TranslateTextureArg( g_wT1AArg2 ) );
  593.     if( g_wT1AOp != D3DTOP_DISABLE && g_wT1AOp != D3DTOP_SELECTARG1 )
  594.         strcat( strOutText, buffer );
  595.     strcat( strOutText, _T("\015\012") );
  596.  
  597.     sprintf( buffer, strTemplate, 2, _T("COLORARG1, "), TranslateTextureArg( g_wT2CArg1 ) );
  598.     if( g_wT2COp != D3DTOP_DISABLE && g_wT2COp != D3DTOP_SELECTARG2 )
  599.         strcat( strOutText, buffer );
  600.     sprintf( buffer, strTemplate, 2, _T("COLOROP,   D3DTOP_"), TranslateTextureOp( g_wT2COp ) );
  601.     strcat( strOutText, buffer );
  602.     sprintf( buffer, strTemplate, 2, _T("COLORARG2, "), TranslateTextureArg( g_wT2CArg2 ) );
  603.     if( g_wT2COp != D3DTOP_DISABLE && g_wT2COp != D3DTOP_SELECTARG1 )
  604.         strcat( strOutText, buffer );
  605.     sprintf( buffer, strTemplate, 2, _T("ALPHAARG1, "), TranslateTextureArg( g_wT2AArg1 ) );
  606.     if( g_wT2AOp != D3DTOP_DISABLE && g_wT2AOp != D3DTOP_SELECTARG2 )
  607.         strcat( strOutText, buffer );
  608.     sprintf( buffer, strTemplate, 2, _T("ALPHAOP,   D3DTOP_"), TranslateTextureOp( g_wT2AOp ) );
  609.     strcat( strOutText, buffer );
  610.     sprintf( buffer, strTemplate, 2, _T("ALPHAARG2, "), TranslateTextureArg( g_wT2AArg2 ) );
  611.     if( g_wT2AOp != D3DTOP_DISABLE && g_wT2AOp != D3DTOP_SELECTARG1 )
  612.         strcat( strOutText, buffer );
  613.     strcat( strOutText, _T("\015\012") );
  614.     strcat( strOutText, _T("   DWORD dwNumPasses;\015\012") );
  615.     strcat( strOutText, _T("   return pd3dDevice->ValidateDevice( &dwNumPasses );\015\012") );
  616.     strcat( strOutText, _T("}\015\012") );
  617.  
  618.     pEdit->SetWindowText( strOutText );
  619.  
  620.     return CDialog::OnInitDialog();
  621. }
  622.  
  623.  
  624.  
  625.  
  626. //-----------------------------------------------------------------------------
  627. // Name: OnViewCode()
  628. // Desc: When the user hits the "view code" button
  629. //-----------------------------------------------------------------------------
  630. void CAppForm::OnViewCode()
  631. {
  632.     CViewCodeDlg dlg;
  633.     dlg.DoModal();
  634. }
  635.  
  636.  
  637.  
  638.  
  639.